#  set集合的定义
# 1. set集合定义时,使用{}在内部增加元素即可
# 格式: {元素1, 元素2, 元素3....}
set1 = {1, 2, 3, 4}
print(set1)  # {1, 2, 3, 4}
print(type(set1))  # <class 'set'>

print('------------')

# 2. 创建一个空集合
set2 = {}
print(set2)  # {}
print(type(set2))  # <class 'dict'>

print('------------')

# 注意: {} 是空字典的意思,并不是一个空集合,所以如果使用该{}只能创建空字典
set3 = set()
print(set3)  # set()
print(type(set3))  # <class 'set'>

print('-----------------------')
# 3. 定义一个单元素集合
set4 = {3}
print(set4)  # {3}
print(type(set4))  # <class 'set'>

print('------------')

# 集合的特性就是无序 和不重复
# 无序: 容器内的数据元素顺序不可以被控制的
set5 = {1, 2, 3, 4}
set6 = {4, 1, 3, 2}
print(set5)  # {1, 2, 3, 4}
print(set6)  # {1, 2, 3, 4}

set7 = {'Tom', 'Bob', 'Dave', 'Rose', 'Jay'}
print(set7)  # 每次打印上述元素的顺序不一定相同

# 无序带来的影响,就是不能使用索引, 所有需要使用索引的容器操作方式他都没有例如index
# print(set7[3]) # TypeError: 'set' object is not subscriptable

print('------------')

# 不重复
# 写入到集合中的元素会自动去重, 去重规则就是判断哈希值是否相同
set8 = {1, 2, 3, 4, 3, 2, 1, 4, 3, 2, 1}
print(set8)  # {1, 2, 3, 4}
print(type(set8))  # <class 'set'>

print('-----------------------')
# 数值型之间  在去重时 True 等价于 1 等价于 1.0   False 等价于 0 等价于 0.0
set9 = {False, 3, 4, 1.0, 0, True}
print(set9)  # {False, 1.0, 3, 4}

# 结论: 在set集合中,后添加进去的输入如果在容器中已经存在,则忽略,如果不存在则添加

# 注意: 在数值型数据中  False == 0  True == 1
print(False == 0)  # True
print(True == 1)  # True

print('-----------------------')
# set集合的遍历
for i in set7:
    print(i)

print('-----------------------')
# ------
# 整型的哈希值就是整数本身,
# 但是 其他数据类型的哈希值,需要进行计算
# 字符型数据,在python中每次代码运行计算的哈希值都不相同
print(hash(1))  # 1
print(hash(1256))  # 1256
print(hash(-1256))  # -1256
print(hash(-12.56))  # -1291272085159669772

print('-----------------------')
# 如果容器中含有字符型数据,python中每次运算的哈希值都不相同
# 一次程序运行过程中相同值的数据哈希值相同
print(hash('传智'))
print(hash((1, 2, '传智')))
print(hash((1, 2, '传智')))
print(hash((1, 2, '传智')))

# 如果同一个程序中的数据的哈希值相同,证明该数据的值相同, 字典的键, 集合的元素,都是通过哈希值判断进行去重的.
# set集合也是通过哈希值进行排序的, 所以集合中为整型数据,会固定排序, 为字符型数据排序会变化

# hash 还常用于分组, 抽样, 加密等.
